package com.example.scanner.zxing.isbn;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * ISBNScanner工具类
 *
 * @author zwg
 * @date 2025/8/12 22:21
 */
@Slf4j
public class ISBNScannerUtil {

    public static String scanISBN(String imagePath) {
        // 读取图像文件
        File imageFile = new File(imagePath);
        if(!imageFile.exists()){
            return null;
        }
        return scanISBN(imageFile);
    }

    public static String scanISBN(File imageFile) {
        try {
            BufferedImage image = ImageIO.read(imageFile);
            return scanISBN(image);
        }catch (IOException e){
            log.error("读取图像文件错误",e);
            return null;
        }

    }
    public static String scanISBN(BufferedImage image) {
        try {
            if (image == null) {
                log.error("无法读取图像文件");
                return null;
            }

            // 将图像转换为ZXing需要的格式
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

            // 识别条形码
            MultiFormatReader reader = new MultiFormatReader();
            Result result = reader.decode(bitmap);

            // 检查是否是ISBN格式
            String barcodeText = result.getText();
            if (isValidISBN(barcodeText)) {
                return barcodeText;
            } else {
                log.error("识别到的不是有效的ISBN");
                return null;
            }

        } catch (Exception e) {
            log.error("识别失败: {}", e.getMessage(),e);
            return null;
        }
    }

    // 简单验证ISBN格式
    private static boolean isValidISBN(String isbn) {
        // ISBN-13是13位数字
        if (isbn.matches("\\d{13}")) {
            return true;
        }
        // ISBN-10是10位数字，最后一位可能是X
        if (isbn.matches("\\d{9}[\\dXx]")) {
            return true;
        }
        return false;
    }
}
